# -*- coding: utf-8 -*-
# @文件名称 : get_updates.py
# @创建时间 : 2024-11-08
# @功能描述 : 获取最新版本信息，提供新版本下载

import requests, os, sys
import tkinter as tk
from tkinter import messagebox, Toplevel, ttk
from utils import center_window, get_icon_path
import about
import concurrent.futures

# 最新版本的地址
latest_release_url = about.project_git_url + '/releases/latest'

# 获取到最新版本程序的下载直链并开始下载
def download_latest_url(main_root):
    # 获取最新版本的下载链接
    response = requests.get(latest_release_url)
    if response.status_code == 200:
        latest_version_info = response.json()
        # 获取release的.exe文件的下载链接
        exe_download_url = next((file['cli_download_url'] for file in latest_version_info['release']['release']['attach_files'] if file['name'].endswith('.exe')), None)
        exe_latest_name = next((file['name'] for file in latest_version_info['release']['release']['attach_files'] if file['name'].endswith('.exe')), None)
        # 获取可执行文件的实际路径
        if getattr(sys, 'frozen', False):
            # 打包后的环境
            base_dir = os.path.dirname(os.path.realpath(sys.executable))
        else:
            # 开发环境
            base_dir = os.path.dirname(os.path.abspath(__file__))
        exe_save_path = os.path.join(base_dir, exe_latest_name)
        #exe_save_path = "C:/Users/Dangk/Downloads" + '/' + exe_latest_name  # 测试地址
        if exe_download_url:
            # 直接下载程序
            download_file(main_root, exe_download_url, exe_save_path)
        else:
            messagebox.showerror("错误", "找不到可下载的.exe文件。")

# 下载窗口，进行文件下载
def download_file(main_root, url, save_path):
    # 创建一个Toplevel窗口
    download_window = Toplevel(main_root)
    download_window.title("下载进度")
    download_window.configure(bg='white')
    center_window(download_window, 400, 120)
    download_window.iconbitmap(get_icon_path())
    download_window.resizable(False, False)  # 禁止调整窗口大小
        
    # 设置进度条
    progress_frame = tk.Frame(download_window, bg=download_window.cget('bg'))  # 设置进度条框架背景色与主窗口一致
    progress_frame.pack(pady=20)
    
    # 设置进度条样式
    progressBar_style = ttk.Style(download_window)
    progressBar_style.configure("Custom.Horizontal.TProgressbar", background='blue', troughcolor='gray', bordercolor=download_window.cget('bg'), lightcolor=download_window.cget('bg'), darkcolor=download_window.cget('bg'))
    
    progress = ttk.Progressbar(progress_frame, orient=tk.HORIZONTAL, length=int(download_window.winfo_width() * 0.8), mode='determinate', style="Custom.Horizontal.TProgressbar")
    progress.pack(side=tk.LEFT, padx=(0, 10))
    
    # 设置进度百分比标签
    percent_label = tk.Label(progress_frame, text="0%", bg=download_window.cget('bg'))  # 设置标签背景色与主窗口一致
    percent_label.pack(side=tk.RIGHT)
    
    # 设置状态标签
    status_text = tk.Label(download_window, text="准备下载...", bg=download_window.cget('bg'))  # 设置标签背景色与主窗口一致
    status_text.pack(pady=10)
    

    # 下载文件
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()  # 检查请求是否成功
        
        # 获取文件总大小
        total_length = int(response.headers.get('content-length'))
        
        # 打开文件准备写入
        with open(save_path, 'wb') as file:
            # 初始化已下载大小
            downloaded = 0
            
            # 开始下载前更新状态标签
            status_text.config(text="下载中...")
            
            # 遍历响应数据块
            for data in response.iter_content(chunk_size=4096):
                # 写入文件
                file.write(data)
                
                # 更新已下载大小
                downloaded += len(data)
                
                # 计算百分比
                percent = int((downloaded / total_length) * 100)
                
                # 更新进度条
                progress['value'] = percent
                download_window.update_idletasks()
                
                # 更新状态标签
                status_text.config(text=f"下载中...")
               
                # 更新百分比标签
                percent_label.config(text=f"{percent}%")
        
        # 下载完成，提示下载文件位置
        status_text.config(text=f"下载成功，将自动为您打开文件保存目录！")
        
        # 自动打开保存地址
        download_window.after(2000, lambda: (os.startfile(os.path.dirname(save_path)), download_window.destroy()))
        
    except requests.RequestException as e:
        # 下载出错，更新状态标签
        status_text.config(text=f"下载文件时发生错误: {e}")
    
    # 启动Tkinter事件循环
    download_window.mainloop()

# 检查更新状态，获取新版本信息
def check_for_updates(main_root=None):
    # 发送请求获取最新版本的标签信息
    response = requests.get(latest_release_url)
    if response.status_code == 200:
        # 解析JSON数据以获取最新版本号
        latest_version_info = response.json()
        latest_version = latest_version_info['release']['tag']['name']

        # 当前应用的版本号
        current_version = about.file_version  # 调用about模块获取版本号

        # 比较版本号
        if current_version < latest_version:
            # 显示消息框并提供下载选项
            if messagebox.askyesno("更新", f"有新版本可用 ! \n当前版本：{current_version} \n最新版本：{latest_version}\n您要下载吗？", parent=main_root):
                download_latest_url(main_root)
        else:
            messagebox.showinfo("更新", f"当前已是最新版本: {current_version}", parent=main_root)


if __name__ == '__main__':
    main_root = tk.Tk()
    main_root.withdraw()  # 隐藏顶级窗口
    check_for_updates(main_root)
    main_root.mainloop()


# if __name__ == '__main__':
# 这行代码确保只有当脚本直接运行时，以下代码块才会执行。如果脚本被其他模块导入，则不会执行这部分代码。
# 这是一个常见的 Python 脚本入口点，用于区分直接运行和被导入的情况。